package com.train.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.train.user.domain.Post;
import com.train.user.domain.SysPostLike;
import com.train.user.mapper.SysPostLikeMapper;
import com.train.user.service.PostService;
import com.train.user.service.SysPostLikeService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
* @author HP
* @description 针对表【sys_post_like(动态点赞表)】的数据库操作Service实现
* @createDate 2025-10-24 16:01:41
*/
@Service
public class SysPostLikeServiceImpl extends ServiceImpl<SysPostLikeMapper, SysPostLike>
    implements SysPostLikeService{

    private static final Logger logger = LoggerFactory.getLogger(SysPostLikeServiceImpl.class);

    @Autowired
    private PostService postService;

    /**
     * 点赞动态
     * @param userId 用户ID
     * @param postId 动态ID
     * @return 是否点赞成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean likePost(Long userId, Long postId) {
        // 参数校验
        if (userId == null || postId == null) {
            logger.warn("点赞失败：用户ID或动态ID不能为空");
            return false;
        }
        
        // 检查动态是否存在
        Post post = postService.getById(postId);
        if (post == null) {
            logger.warn("点赞失败：动态ID {} 不存在", postId);
            return false;
        }
        
        // 检查是否已经点赞（使用exists提高性能）
        if (isPostLikedByUser(userId, postId)) {
            logger.info("用户 {} 已经点赞过动态 {}", userId, postId);
            return false; // 已经点赞过，不需要重复点赞
        }
        
        // 创建点赞记录
        SysPostLike postLike = new SysPostLike();
        postLike.setUserId(userId);
        postLike.setPostId(postId);
        postLike.setCreateBy(userId.toString());
        
        // 保存点赞记录
        boolean saved = save(postLike);
        
        if (saved) {
            try {
                // 使用乐观锁机制更新点赞数，避免并发问题
                boolean updateSuccess = postService.incrementLikeCount(postId);
                if (!updateSuccess) {
                    logger.warn("更新动态 {} 点赞数失败", postId);
                    // 抛出异常，让事务回滚
                    throw new RuntimeException("更新点赞数失败");
                }
                logger.info("用户 {} 点赞动态 {} 成功", userId, postId);
            } catch (Exception e) {
                logger.error("更新点赞数异常", e);
                throw e; // 重新抛出异常让事务回滚
            }
        }
        
        return saved;
    }

    /**
     * 取消点赞动态
     * @param userId 用户ID
     * @param postId 动态ID
     * @return 是否取消点赞成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean cancelLikePost(Long userId, Long postId) {
        // 参数校验
        if (userId == null || postId == null) {
            logger.warn("取消点赞失败：用户ID或动态ID不能为空");
            return false;
        }
        
        // 检查是否已经点赞
        if (!isPostLikedByUser(userId, postId)) {
            logger.info("用户 {} 未点赞过动态 {}", userId, postId);
            return false; // 没有点赞记录，无需取消
        }
        
        // 删除点赞记录
        LambdaQueryWrapper<SysPostLike> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysPostLike::getUserId, userId)
                   .eq(SysPostLike::getPostId, postId);
        
        boolean removed = remove(queryWrapper);
        
        if (removed) {
            try {
                // 使用乐观锁机制更新点赞数，避免并发问题
                boolean updateSuccess = postService.decrementLikeCount(postId);
                if (!updateSuccess) {
                    logger.warn("更新动态 {} 点赞数失败", postId);
                    // 抛出异常，让事务回滚
                    throw new RuntimeException("更新点赞数失败");
                }
                logger.info("用户 {} 取消点赞动态 {} 成功", userId, postId);
            } catch (Exception e) {
                logger.error("更新点赞数异常", e);
                throw e; // 重新抛出异常让事务回滚
            }
        }
        
        return removed;
    }

    /**
     * 检查用户是否点赞了动态
     * @param userId 用户ID
     * @param postId 动态ID
     * @return 是否已点赞
     */
    @Override
    public boolean isPostLikedByUser(Long userId, Long postId) {
        // 参数校验
        if (userId == null || postId == null) {
            return false;
        }
        
        LambdaQueryWrapper<SysPostLike> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysPostLike::getUserId, userId)
                   .eq(SysPostLike::getPostId, postId);
        
        // 使用exists方法而不是count方法，提高性能
        return getBaseMapper().exists(queryWrapper);
    }

    /**
     * 根据动态ID查询点赞列表
     * @param postId 动态ID
     * @return 点赞列表
     */
    @Override
    public List<SysPostLike> getLikesByPostId(Long postId) {
        // 参数校验
        if (postId == null) {
            logger.warn("查询点赞列表失败：动态ID不能为空");
            return Collections.emptyList(); // 返回空列表而不是null
        }
        
        LambdaQueryWrapper<SysPostLike> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysPostLike::getPostId, postId)
                   .orderByDesc(SysPostLike::getCreateTime); // 按创建时间倒序，最新点赞在前
        
        return list(queryWrapper);
    }
}